// 邮件管理仓库
import {
	defineStore
} from "pinia"

import useUser from "@/store/user.js"

import {
	ElNotification,
	ElMessage
} from 'element-plus'

import axios from "@/axios/index.js"



let useEmail = defineStore("email", {
	state: () => {
		return {
			// 邮件列表
			emailList: [],
			// 已读列表
			readList: null,
			// 删除列表
			deletList: new Set([]),
			// 过滤方法
			option: [],
			// 仅查看的对象
			onlyShow: "",
			// 模糊查询的对象
			search: "",
			// 线程对象
			Thread: null,
		}
	},
	getters: {
		// 根据筛选条件，获取邮件列表
		getemailList(state) {
			let emailList = [];
			let userData = useUser();
			if (state.emailList) {
				// 多个筛选需要同时起作用
				emailList = state.emailList.filter((value) => {
					let flag = true;

					// 如果该邮件已经删除,那么不显示该邮件
					if (state.deletList.has(value._id)) {
						return false;
					}

					// 1-循环选项列表
					// 根据过滤条件，筛选显示内容
					for (let i = 0; i < state.option.length; i++) {
						switch (state.option[i]) {
							case "1": //不显示已读
								if (state.readList.has(value._id)) {
									return false;
								}
								break;
							case "2": //不显示未读
								if (!state.readList.has(value._id)) {
									return false;
								}
								break;
							case "3": //不显示系统邮件
								if (value.sendType == "system") {
									return false;
								}
								break;
							case "4": //不显示发送
								if (value.sendID == userData.user._id) {
									return false;
								}
								break;
							case "5": //不显示接收
								if (value.receiveID == userData.user._id) {
									return false;
								}
								break;
							default:
								break;
						}
					}

					// 2-只看操作，只筛选指定用户的发送或者接收的值
					if (state.onlyShow == "") {
						console.log();
					} else if (state.onlyShow == value.receiveID) {
						console.log();
					} else if (state.onlyShow == value.sendID) {
						console.log();
					} else {
						return false;
					}


					// 3-模糊匹配邮件内容
					if (state.search != "") {
						// 正则规则
						const regex = new RegExp(state.search, 'i');
						flag = regex.test(value.message) || regex.test(value.notes) || regex.test(value
							.receiveID) || regex.test(
							value
							.sendID);
					}

					return flag;
				});
			}

			return emailList;
		},
	},
	actions: {
		updateEmailData(emailList) {
			this.emailList = emailList;
		},
		updateReadData(readList) {
			// 已读列表的数据类型，为set类型
			this.readList = new Set(readList);
		},
		readBoolean(emailID) { //判断是否已读方法
			return this.readList.has(emailID);
		},
		// 设置邮件的读取状态
		setRead(emailID, flag = true) {
			if (flag) {
				// 这里需要不能重复添加已读列表
				this.readList.add(emailID);
			} else {
				this.readList.delete(emailID);
			}

			// 延时更新数据
			this.updateEmail();
		},
		// 设置全部邮件的已读和未读行为
		setAllRead(flag = true) {

			if (flag) {
				// 将所有邮件标记为已读    
				this.getemailList.forEach(email => {
					this.readList.add(email._id);
				});
			} else {
				// 将所有邮件标记为未读（从readList中移除）    
				this.getemailList.forEach(email => {
					this.readList.delete(email._id);
				});
			}

			ElNotification({
				title: '操作完成',
				message: '邮件已全部设置为' + (flag ? '已读' : '未读'),
				type: 'success',
				offset: 100,
				duration: 3000,
			})
			// 延时更新数据
			this.updateEmail();
		},
		// 删除事件
		deleteEmail(emailID) {
			// 在删除列表中,添加删除邮件id
			this.deletList.add(emailID);
			this.updateEmail();
			ElMessage({
				message: '邮件删除成功.',
				type: 'success',
				duration: 1000,
			})
		},
		addEmailData(emailObj) {
			this.emailList.push(emailObj);
			ElNotification({
				title: '您有一封新的邮件!',
				message: emailObj.message,
				type: 'success',
				offset: 100,
				duration: 10000,
			})
		},
		// 通过邮件id获取邮件
		getEmailById(emailID) {
			for (let i = 0; i < this.emailList.length; i++) {
				if (this.emailList[i]._id == emailID) {
					return this.emailList[i];
				}
			}
			return null;
		},
		// 设置邮件的结果，达到前端的数据对齐的作用
		setEmailResult(emailID, result) {
			console.log(" 修改指定邮件的结果")
			for (let i = 0; i < this.emailList.length; i++) {
				if (this.emailList[i]._id == emailID) {
					this.emailList[i].result = result;
					// 设置该邮件已读
					this.setRead(emailID);
					return true;
				}
			}
			return false;
		},
		// 是为了实现延时更新,当更新的时候,等待用户全部执行完毕后,再向后端请求
		// 每一次update函数被调用，都会延迟执行异步函数
		updateEmail() {
			// 如果已经有等待执行的异步函数时,清除重新计算时间
			if (this.Thread) {
				clearTimeout(this.Thread);
			}

			// 保存线程值
			this.Thread = setTimeout(() => {
				// 把已读列表和删除列表进行操作,当删除列表中存在的时候,已读信息不保存
				let deletList = [...this.deletList];
				let readList = [...this.readList];

				// 当删除数组的长度大于0,过滤数组,将删除列表和已读列表数据进行对比
				if (deletList.length) {
					readList = readList.filter((value) => !this.deletList.has(value))
				}

				// 将已读列表和删除列表，发送给后端
				axios.post("/email/updateEmail", {
					deletList,
					readList
				}).then(() => {

				}).catch((error) => {
					ElNotification({
						title: '错误!',
						message: '用户请求失败，请检查网络连接！',
						type: 'error',
						offset: 100,
						duration: 3000,
					})
				}).finally(() => {
					this.Thread = null;
				})
			}, 10000)
		}
	}
})


// 默认导出仓库对象
export default useEmail;